package config

import "github.com/spf13/viper"

// setDefaults 设置默认配置
func setDefaults(v *viper.Viper) {
	// 应用默认配置
	v.SetDefault("app.name", "baseService")
	v.SetDefault("app.version", "1.0.0")
	v.SetDefault("app.environment", "development")

	// 服务器默认配置
	v.SetDefault("server.host", "0.0.0.0")
	v.SetDefault("server.port", 8080)
	v.SetDefault("server.read_timeout", "30s")
	v.SetDefault("server.write_timeout", "30s")
	v.SetDefault("server.idle_timeout", "60s")
	v.SetDefault("server.allow_cross_domain", true)

	// 数据库默认配置
	v.SetDefault("database.driver", "mysql")
	v.SetDefault("database.host", "localhost")
	v.SetDefault("database.port", 3306)
	v.SetDefault("database.charset", "utf8mb4")
	v.SetDefault("database.max_idle_conns", 10)
	v.SetDefault("database.max_open_conns", 100)
	v.SetDefault("database.conn_max_lifetime", "1h")
	v.SetDefault("database.log_level", "warn")
	v.SetDefault("database.auto_migrate", true)
	v.SetDefault("database.enable_warmup", true)
	v.SetDefault("database.warmup_timeout", "10s")

	// Redis默认配置
	v.SetDefault("redis.host", "localhost")
	v.SetDefault("redis.port", 6379)
	v.SetDefault("redis.database", 0)
	v.SetDefault("redis.max_idle", 10)
	v.SetDefault("redis.max_active", 100)
	v.SetDefault("redis.idle_timeout", "300s")
	v.SetDefault("redis.connect_timeout", "5s")
	v.SetDefault("redis.read_timeout", "3s")
	v.SetDefault("redis.write_timeout", "3s")

	// 应用日志默认配置
	v.SetDefault("log.filename", "./storage/logs/app.log")
	v.SetDefault("log.max_size", 50)
	v.SetDefault("log.max_age", 30)
	v.SetDefault("log.max_backups", 10)
	v.SetDefault("log.max_body_size", 1048576) // 1MB
	v.SetDefault("log.compress", true)
	v.SetDefault("log.local_time", true)

	// 设置中间件默认值
	setMiddlewareDefaults(v)

	// 设置缓存默认值
	setCacheDefaults(v)

	// 设置事件总线默认值
	setEventBusDefaults(v)
}

// setMiddlewareDefaults 设置中间件默认配置
func setMiddlewareDefaults(v *viper.Viper) {
	// JWT认证中间件
	v.SetDefault("middleware.auth.enable", true)
	v.SetDefault("middleware.auth.jwt_secret", "baseservice-jwt-secret-key-2024")
	v.SetDefault("middleware.auth.token_expiry", 86400) // 24小时
	v.SetDefault("middleware.auth.issuer", "baseService")
	v.SetDefault("middleware.auth.skip_paths", []string{
		"/health", "/metrics", "/api/v1/auth/login",
		"/api/v1/auth/register", "/api/v1/public/*",
	})
	v.SetDefault("middleware.auth.token_header", "Authorization")
	v.SetDefault("middleware.auth.token_query", "token")
	v.SetDefault("middleware.auth.refresh_threshold", 3600) // 60分钟
	v.SetDefault("middleware.auth.max_refresh_count", 5)

	// 限流中间件（简化版）
	v.SetDefault("middleware.ratelimit.enable", true)
	v.SetDefault("middleware.ratelimit.rate", 1000)  // 每秒1000个请求
	v.SetDefault("middleware.ratelimit.burst", 2000) // 突发2000个请求
	v.SetDefault("middleware.ratelimit.skip_paths", []string{
		"/health", "/metrics", "/favicon.ico",
	})

	// CORS中间件
	v.SetDefault("middleware.cors.enable", true)
	v.SetDefault("middleware.cors.allow_origins", []string{"*"})
	v.SetDefault("middleware.cors.allow_methods", []string{
		"GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH",
	})
	v.SetDefault("middleware.cors.allow_headers", []string{
		"Origin", "Content-Type", "Authorization", "X-Requested-With",
	})
	v.SetDefault("middleware.cors.expose_headers", []string{
		"Content-Length", "X-Request-ID",
	})
	v.SetDefault("middleware.cors.allow_credentials", true)
	v.SetDefault("middleware.cors.max_age", 86400)

	// 链路追踪中间件（简化版 - 默认关闭）
	v.SetDefault("middleware.tracing.enable", false)
	v.SetDefault("middleware.tracing.trace_id_header", "X-Request-ID")
	v.SetDefault("middleware.tracing.skip_paths", []string{
		"/health", "/favicon.ico",
	})
}

// setCacheDefaults 设置缓存默认配置
func setCacheDefaults(v *viper.Viper) {
	// 缓存系统
	v.SetDefault("cache.enable", true)
	v.SetDefault("cache.engine", "memory")
	v.SetDefault("cache.default_ttl", "30m")

	// 内存缓存
	v.SetDefault("cache.memory.max_items", 50000)
	v.SetDefault("cache.memory.cleanup_interval", "5m")

	// Redis缓存
	v.SetDefault("cache.redis.url", "redis://localhost:6379")
	v.SetDefault("cache.redis.prefix", "cache:")
}

// setEventBusDefaults 设置事件总线默认配置
func setEventBusDefaults(v *viper.Viper) {
	v.SetDefault("eventbus.enable", true)
	v.SetDefault("eventbus.type", "sync")
	v.SetDefault("eventbus.max_workers", 10)
	v.SetDefault("eventbus.queue_size", 1000)
	v.SetDefault("eventbus.enable_retry", true)
	v.SetDefault("eventbus.max_retries", 3)
	v.SetDefault("eventbus.retry_delay", "1s")
}
